﻿using System;
using System.Collections.Generic;
using System.Text;

namespace ServiceCore.Tool.TIM.chat_message
{
    /// <summary>
    /// 通过服务端集成的 Rest API 接口，只能发送 TIMTextElem，TIMLocationElem，TIMFaceElem，TIMCustomElem 类型的消息，其它类型的消息（TIMSoundElem，TIMImageElem，TIMFileElem，TIMVideoFileElem）不能通过 Rest API 接口发送。
    /// </summary>
    public class MsgBody
    {
        /// <summary>
        ///  定义基础类
        /// </summary>
        public class base_body<T>
        {
            public virtual string MsgType { get { return "no_set"; } }

            public T MsgContent { get; set; }
        }

        /// <summary>
        /// 文本消息元素
        /// </summary>
        public class TIMTextElem : base_body<TIMTextElem_body>
        {
            public override string MsgType { get { return "TIMTextElem"; } } 
             
        } 
        public class TIMTextElem_body
        {
           public string Text { get; set; }
        }



        public class TIMLocationElem : base_body<TIMLocationElem_body>
        {
            public override string MsgType { get { return "TIMLocationElem"; } }
        }
        public class TIMLocationElem_body
        {
            /// <summary>
            /// 	地理位置描述信息。
            /// </summary>
            public string Desc { get; set; }
            /// <summary>
            /// 纬度。
            /// </summary>
            public double Latitude { get; set; }
            /// <summary>
            /// 经度。
            /// </summary>
            public double Longitude { get; set; }
        }


        /// <summary>
        /// 表情推送
        /// </summary>
        public class TIMFaceElem : base_body<TIMFaceElem_body>
        {
            public override string MsgType { get { return "TIMFaceElem"; } }
        }
        public class TIMFaceElem_body
        {
            /// <summary>
            /// 表情索引，用户自定义。。
            /// </summary>
            public int Index { get; set; }
            /// <summary>
            ///  额外数据。
            /// </summary>
            public string Data { get; set; } 
        }

        /// <summary>
        /// 自定义消息元素
        /// </summary>
        public class TIMCustomElem : base_body<TIMCustomElem_body>
        {
            public override string MsgType { get { return "TIMCustomElem"; } }
        }
        public class TIMCustomElem_body
        {
            /// <summary>
            /// 自定义消息数据。 不作为 APNs 的 payload 字段下发，故从 payload 中无法获取 Data 字段。
            /// </summary>
            public string Data { get; set; }
            /// <summary>
            ///  自定义消息描述信息。当接收方为 iOS 或 Android 后台在线时，做离线推送文本展示。
            ///若发送自定义消息的同时设置了 OfflinePushInfo.Desc 字段，此字段会被覆盖，请优先填 OfflinePushInfo.Desc 字段。
            ///当消息中只有一个 TIMCustomElem 自定义消息元素时，如果 Desc 字段和 OfflinePushInfo.Desc 字段都不填写，将收不到该条消息的离线推送，需要填写 OfflinePushInfo.Desc 字段才能收到该消息的离线推送。。
            /// </summary>
            public string Desc { get; set; }
            /// <summary>
            /// 扩展字段。当接收方为 iOS 系统且应用处在后台时，此字段作为 APNs 请求包 Payloads 中的 Ext 键值下发，Ext 的协议格式由业务方确定，APNs 只做透传。
            /// </summary>
            public string Ext { get; set; }
            /// <summary>
            /// 自定义 APNs 推送铃音。
            /// </summary>
            public string Sound { get; set; }
        }
    }
    #region 单发单聊消息
    /// <summary>
    /// 定义请求包
    /// </summary>
    public class sendmsg : base_post_model<sendmsg_post>
    {
        public override string servicename
        {
            get { return   "openim";   }
        }
        public override string command
        {
            get { return "sendmsg"; }
        }
    }

    public class base_send_msg_post
    {
        /// <summary>
        /// 若不希望将消息同步至 From_Account，则 SyncOtherMachine 填写2；若希望将消息同步至 From_Account，则 SyncOtherMachine 填写1。
        /// </summary>
        public int SyncOtherMachine { get; set; } = 1;
        /// <summary>
        /// 消息发送方 UserID（用于指定发送消息方帐号）
        /// </summary>
        public string From_Account { get; set; }

        /// <summary>
        /// 消息离线保存时长（单位：秒），最长为7天（604800秒）
        /// 若设置该字段为0，则消息只发在线用户，不保存离线
        /// 若设置该字段超过7天（604800秒），仍只保存7天
        /// 若不设置该字段，则默认保存7天
        /// </summary>
        public int? MsgLifeTime { get; set; } = 60 * 60 * 24 * 2;
        /// <summary>
        /// 消息随机数，由随机函数产生，用于后台定位问题
        /// </summary>
        public int MsgRandom { get { return new Random().Next(100000, 99999999); } }
        /// <summary>
        /// 消息时间戳，UNIX 时间戳（单位：秒）
        /// </summary>
        public long MsgTimeStamp
        {
            get
            {
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds);
            }
        }
        /// <summary>
        /// 消息回调禁止开关，只对本条消息有效，ForbidBeforeSendMsgCallback 表示禁止发消息前回调，ForbidAfterSendMsgCallback 表示禁止发消息后回调
        /// </summary>
        public string[] ForbidCallbackControl { get; set; } = new string[] { };
        /// <summary>
        ///消息内容，具体格式请参考 https://cloud.tencent.com/document/product/269/2720 （注意，一条消息可包括多种消息元素，MsgBody 为 Array 类型）
        /// </summary>
        public object[] MsgBody { get; set; }

        /// <summary>
        /// 离线配置
        /// </summary>
        //public OfflinePushInfo_model OfflinePushInfo { get; set; } = new OfflinePushInfo_model();
    }
    /// <summary>
    /// 定义post模型
    /// </summary>
    public class sendmsg_post : base_send_msg_post
    { 
        /// <summary>
        /// 发送到 
        /// </summary>
        public string To_Account { get; set; }

    }

    public class OfflinePushInfo_model
    {
        /// <summary>
        /// 0表示推送，1表示不离线推送。
        /// </summary>
        public int? PushFlag { get; set; }
        /// <summary>
        /// 离线推送标题。该字段为 iOS 和 Android 共用。
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 离线推送内容。该字段会覆盖上面各种消息元素 TIMMsgElement 的离线推送展示文本。 若发送的消息只有一个 TIMCustomElem 自定义消息元素，该 Desc 字段会覆盖 TIMCustomElem 中的 Desc 字段。如果两个 Desc 字段都不填，将收不到该自定义消息的离线推送。
        /// </summary>
        public string Desc { get; set; }
        /// <summary>
        /// 离线推送透传内容。由于国内各 Android 手机厂商的推送平台要求各不一样，请保证此字段为 JSON 格式，否则可能会导致收不到某些厂商的离线推送。
        /// </summary>
        public string Ext { get; set; }

        public AndroidInfo AndroidInfo { get; set; }

        public ApnsInfo ApnsInfo { get; set; }
    }

    public class AndroidInfo {
        /// <summary>
        /// Android 离线推送声音文件路径。
        /// </summary>
        public string Sound { get; set; }
        /// <summary>
        /// 小米手机 MIUI 10 及以上的通知类别（Channel）适配字段。
        /// </summary>
        public string HuaWeiChannelID { get; set; }
        /// <summary>
        /// OPPO 手机 Android 8.0 及以上的 NotificationChannel 通知适配字段。
        /// </summary>
        public string OPPOChannelID { get; set; }
        /// <summary>
        /// Google 手机 Android 8.0 及以上的通知渠道字段。Google 推送新接口（上传证书文件）支持 channel id ，旧接口（填写服务器密钥）不支持。
        /// </summary>
        public string GoogleChannelID { get; set; }  
    }

    public class ApnsInfo
    {
        /// <summary>
        /// 这个字段缺省或者为0表示需要计数，为1表示本条消息不需要计数，即右上角图标数字不增加。
        /// </summary>
        public int BadgeMode { get; set; }
        /// <summary>
        /// 该字段用于标识 APNs 推送的标题，若填写则会覆盖最上层 Title。
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 	该字段用于标识 APNs 推送的子标题。
        /// </summary>
        public string SubTitle { get; set; }
        /// <summary>
        /// 该字段用于标识 APNs 携带的图片地址，当客户端拿到该字段时，可以通过下载图片资源的方式将图片展示在弹窗上。
        /// </summary>
        public string Image { get; set; }
    }
    /// <summary>
    /// 定义返回模型
    /// </summary>
    public class sendmsg_result : base_post_result
    {
        /// <summary>
        /// 消息唯一标识，用于撤回。长度不超过50个字符
        /// </summary>
        public long MsgTime { get; set; }

        public string MsgKey { get; set; }
    }
    #endregion

    #region 批量发送单聊方法
    /// <summary>
    /// 定义请求包
    /// </summary>
    public class batchsendmsg : base_post_model<batchsendmsg_post>
    {
        public override string servicename
        {
            get { return "openim"; }
        }
        public override string command
        {
            get { return "batchsendmsg"; }
        }
    }
    /// <summary>
    /// 定义post模型
    /// </summary>
    public class batchsendmsg_post : base_send_msg_post
    {
        public string[] To_Account { get; set; }
    }
    /// <summary>
    /// 定义返回模型
    /// </summary>
    public class batchsendmsg_result : base_post_result
    {
        /// <summary>
        /// 消息唯一标识，用于撤回。长度不超过50个字符
        /// </summary>
        public long MsgTime { get; set; }

        public string MsgKey { get; set; }

        public List<ErrorList> ErrorList { get; set; }
    }

    public class ErrorList
    {
        public string To_Account { get; set; }

        public int ErrorCode { get; set; }
    }
    #endregion


    #region 查询单聊消息
    /// <summary>
    /// 定义请求包
    /// </summary>
    public class admin_getroammsg : base_post_model<admin_getroammsg_post>
    {
        public override string servicename
        {
            get { return "openim"; }
        }
        public override string command
        {
            get { return "admin_getroammsg"; }
        }
    }
    /// <summary>
    /// 定义post模型
    /// </summary>
    public class admin_getroammsg_post 
    {
        /// <summary>
        /// 会话其中一方的 UserID，若已指定发送消息方帐号，则为消息发送方
        /// </summary>
        public string From_Account { get; set; }
        /// <summary>
        /// 会话其中一方的 UserID
        /// </summary>
        public string To_Account { get; set; }
        /// <summary>
        /// 请求的消息条数
        /// </summary>
        public int MaxCnt { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public long MinTime
        {
            get
            {
                TimeSpan ts = MinTime_date - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds);
            }
        } 
        public DateTime MinTime_date { get; set; } 
        public long MaxTime
        {
            get
            {
                TimeSpan ts = MaxTime_data - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds);
            }
        } 
        public DateTime MaxTime_data { get; set; }
        /// <summary>
        ///  上一次拉取到的最后一条消息的 MsgKey，续拉时需要填该字段，填写方法见上方 示例
        /// </summary>
        public string LastMsgKey { get; set; }
    }
    /// <summary>
    /// 定义返回模型
    /// </summary>
    public class admin_getroammsg_result : base_post_result
    {
        /// <summary>
        /// 是否全部拉取，0表示未全部拉取，需要续拉，1表示已全部拉取
        /// </summary>
        public int Complete { get; set; }
        /// <summary>
        /// 本次拉取到的消息条数
        /// </summary>
        public int MsgCnt { get; set; }
        /// <summary>
        /// 本次拉取到的消息里的最后一条消息的时间
        /// </summary>
        public long LastMsgTime { get; set; }
        /// <summary>
        /// 本次拉取到的消息里的最后一条消息的标识
        /// </summary>
        public string LastMsgKey { get; set; } 
        /// <summary>
        /// 返回的消息列表
        /// </summary>
        public List<MsgList> MsgList { get; set; }
    }

    public class MsgList
    {
        public string From_Account { get; set; }

        public string To_Account { get; set; }

        public long MsgSeq { get; set; }

        public long MsgRandom { get; set; }

        public DateTime MsgTimeStamp_datetime
        {
            get
            {
                //DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
                DateTime dateTimeStart = new DateTime(1970, 1, 1) + TimeZoneInfo.Local.BaseUtcOffset;
                long lTime = long.Parse(MsgTimeStamp + "0000000");
                TimeSpan toNow = new TimeSpan(lTime);
                return dateTimeStart.Add(toNow);
            }
        }

        public long MsgTimeStamp { get; set; }
        /// <summary>
        /// 该条消息的属性，0表示正常消息，8表示被撤回的消息
        /// </summary>
        public int MsgFlagBits { get; set; }

        public string MsgKey { get; set; }

        public object[] MsgBody { get; set; } 
    }
    #endregion

    #region 撤回单聊信息
    /// <summary>
    /// 定义请求包
    /// </summary>
    public class admin_msgwithdraw : base_post_model<admin_msgwithdraw_post>
    {
        public override string servicename
        {
            get { return "openim"; }
        }
        public override string command
        {
            get { return "admin_msgwithdraw"; }
        }
    }
    /// <summary>
    /// 定义post模型
    /// </summary>
    public class admin_msgwithdraw_post
    {
        public string From_Account { get; set; }

        public string To_Account { get; set; }

        public string MsgKey { get; set; }
    }
    /// <summary>
    /// 定义返回模型
    /// </summary>
    public class admin_msgwithdraw_result : base_post_result
    {
       
    } 
    #endregion 
}
